home *** CD-ROM | disk | FTP | other *** search
/ Gamers Delight 2 / Gamers Delight 2.iso / Aminet / game / board / UChessSrc.lha / init.c < prev    next >
C/C++ Source or Header  |  1994-06-15  |  20KB  |  825 lines

  1. /*
  2.  * init.c - C source for GNU CHESS
  3.  *
  4.  * Copyright (c) 1988,1989,1990 John Stanback
  5.  * Copyright (c) 1992 Free Software Foundation
  6.  *
  7.  * This file is part of GNU CHESS.
  8.  *
  9.  * GNU Chess is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2, or (at your option)
  12.  * any later version.
  13.  *
  14.  * GNU Chess is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with GNU Chess; see the file COPYING.  If not, write to
  21.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  22.  */
  23. #include "gnuchess.h"
  24.  
  25. #ifdef CACHE
  26. extern struct etable __far __aligned etab[2][ETABLE];
  27. #endif
  28.  
  29. extern int __aligned ThinkInARow;
  30. extern int __aligned bookflag;
  31. extern int __aligned Sdepth2;
  32.  
  33. #ifdef AMIGA
  34. #define __USE_SYSBASE
  35. #define MOVENOWMENUNUM 0x42
  36. #define THINKMENUNUM 0x82
  37. #define SHOWMENUNUM 0xa2
  38. #define BOOKMENUNUM 0xc2
  39. #define SUPERMENUNUM 0xe2
  40. #define ADVANCEDMENUNUM 0x102
  41. #define INTERMEDIATEMENUNUM 0x122
  42. #define EASYMENUNUM 0x142
  43. #include <proto/exec.h>
  44. #include <proto/dos.h>
  45. #include <proto/intuition.h>
  46. extern int __aligned cmptr_sec,cmptr_min,hum_sec,hum_min;
  47. extern int procpri;
  48. extern struct Process *myproc;
  49. extern int __far ResignOffered;
  50. #endif
  51.  
  52. extern struct Menu Menu1;
  53. #define MenuList1 Menu1
  54. extern int MenuStripSet;
  55. extern struct MenuItem MenuItem8ab;
  56. extern struct Window __aligned *wG;
  57. unsigned int urand (void);
  58.  
  59.  
  60. /* .... MOVE GENERATION VARIABLES AND INITIALIZATIONS .... */
  61.  
  62.  
  63. void InitHashCode(unsigned int);
  64. short __aligned PCRASH,PCENTER;
  65. extern int PlayMode;
  66. extern unsigned int TTadd;
  67.  
  68. #if defined NULLMOVE || defined DEEPNULL
  69. extern short int __aligned no_null;
  70. extern short int __aligned null;         /* Null-move already made or not */
  71. extern short int __aligned PVari;        /* Is this the PV */
  72. #endif
  73. extern short __aligned Threat[MAXDEPTH];
  74. extern unsigned short int __aligned PrVar[MAXDEPTH];
  75. extern short __aligned PawnStorm;
  76. extern short __aligned start_stage;
  77. extern short __aligned thrashing_tt; /* must we recycle slots at random. TomV */
  78. extern short int ISZERO;
  79. extern int __aligned global_tmp_score;
  80. extern int __aligned previous_score;
  81. int __aligned FirstTime=1;
  82. extern int SupervisorMode;
  83. extern int IllegalMove;
  84. extern int CheckIllegal;
  85. #ifdef LONGINTS2
  86. INTSIZE  __far distdata[64][64];
  87. INTSIZE  __far taxidata[64][64];
  88. #else
  89. INTSIZE  __aligned distdata[64][64];
  90. INTSIZE  __aligned taxidata[64][64];
  91. #endif
  92.  
  93. #ifdef KILLT
  94. /* put moves to the center first */
  95. void
  96. Initialize_killt (void)
  97. {
  98.   REG unsigned INTSIZE f, t, s;
  99.   REG INTSIZE d;
  100.   for (f = 64; f--;)
  101.     for (t = 64; t--;)
  102.       {
  103.     d = taxidata[f][0x1b];
  104.     if (taxidata[f][0x1c] < d)
  105.       d = taxidata[f][0x1c];
  106.     if (taxidata[f][0x23] < d)
  107.       d = taxidata[f][0x23];
  108.     if (taxidata[f][0x24] < d)
  109.       d = taxidata[f][0x24];
  110.     s = d;
  111.     d = taxidata[t][0x1b];
  112.     if (taxidata[t][0x1c] < d)
  113.       d = taxidata[t][0x1c];
  114.     if (taxidata[t][0x23] < d)
  115.       d = taxidata[t][0x23];
  116.     if (taxidata[t][0x24] < d)
  117.       d = taxidata[t][0x24];
  118.     s -= d;
  119.     killt[(f << 8) | t] = s;
  120.     killt[(f << 8) | t | 0x80] = s;
  121.       }
  122. }
  123. #endif
  124. void
  125. Initialize_dist (void)
  126. {
  127.   REG INTSIZE a, b, d, di;
  128.  
  129.   for (a = 0; a < 64; a++)
  130.     for (b = 0; b < 64; b++)
  131.       {
  132.     d = abs (column (a) - column (b));
  133.     di = abs (row (a) - row (b));
  134.     taxidata[a][b] = d + di;
  135.     distdata[a][b] = (d > di ? d : di);
  136.       }
  137. #ifdef KILLT
  138.   Initialize_killt ();
  139. #endif
  140. }
  141.  
  142. const INTSIZE __aligned Stboard[64] =
  143. {rook, knight, bishop, queen, king, bishop, knight, rook,
  144.  pawn, pawn, pawn, pawn, pawn, pawn, pawn, pawn,
  145.  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  146.  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  147.  pawn, pawn, pawn, pawn, pawn, pawn, pawn, pawn,
  148.  rook, knight, bishop, queen, king, bishop, knight, rook};
  149. const INTSIZE __aligned Stcolor[64] =
  150. {white, white, white, white, white, white, white, white,
  151.  white, white, white, white, white, white, white, white,
  152.  neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral,
  153.  neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral,
  154.  neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral,
  155.  neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral,
  156.  black, black, black, black, black, black, black, black,
  157.  black, black, black, black, black, black, black, black};
  158. INTSIZE __aligned board[64], color[64];
  159. INTSIZE __aligned amigaboard[64],amigacolor[64];
  160.  
  161. /* given epsquare, from where can a pawn be taken? */
  162. const INTSIZE __aligned epmove1[64] =
  163. {0, 1, 2, 3, 4, 5, 6, 7,
  164.  8, 9, 10, 11, 12, 13, 14, 15,
  165.  16, 24, 25, 26, 27, 28, 29, 30,
  166.  24, 25, 26, 27, 28, 29, 30, 31,
  167.  32, 33, 34, 35, 36, 37, 38, 39,
  168.  40, 32, 33, 34, 35, 36, 37, 38,
  169.  48, 49, 50, 51, 52, 53, 54, 55,
  170.  56, 57, 58, 59, 60, 61, 62, 63};
  171. const INTSIZE __aligned epmove2[64] =
  172. {0, 1, 2, 3, 4, 5, 6, 7,
  173.  8, 9, 10, 11, 12, 13, 14, 15,
  174.  25, 26, 27, 28, 29, 30, 31, 23,
  175.  24, 25, 26, 27, 28, 29, 30, 31,
  176.  32, 33, 34, 35, 36, 37, 38, 39,
  177.  33, 34, 35, 36, 37, 38, 39, 47,
  178.  48, 49, 50, 51, 52, 53, 54, 55,
  179.  56, 57, 58, 59, 60, 61, 62, 63};
  180.  
  181.  
  182. /*
  183.  * nextpos[piece][from-square] , nextdir[piece][from-square] gives vector of
  184.  * positions reachable from from-square in ppos with piece such that the
  185.  * sequence    ppos = nextpos[piece][from-square]; pdir =
  186.  * nextdir[piece][from-square]; u = ppos[sq]; do { u = ppos[u]; if(color[u]
  187.  * != neutral) u = pdir[u]; } while (sq != u); will generate the sequence of
  188.  * all squares reachable from sq.
  189.  *
  190.  * If the path is blocked u = pdir[sq] will generate the continuation of the
  191.  * sequence in other directions.
  192.  */
  193.  
  194. unsigned char __far __aligned nextpos[8][64][64];
  195. unsigned char __far __aligned nextdir[8][64][64];
  196.  
  197. /*
  198.  * ptype is used to separate white and black pawns, like this; ptyp =
  199.  * ptype[side][piece] piece can be used directly in nextpos/nextdir when
  200.  * generating moves for pieces that are not black pawns.
  201.  */
  202. const INTSIZE __aligned ptype[2][8] =
  203. {
  204.   no_piece, pawn, knight, bishop, rook, queen, king, no_piece,
  205.   no_piece, bpawn, knight, bishop, rook, queen, king, no_piece};
  206.  
  207. /* data used to generate nextpos/nextdir */
  208. static const INTSIZE __aligned direc[8][8] =
  209. {
  210.   0, 0, 0, 0, 0, 0, 0, 0,
  211.   10, 9, 11, 0, 0, 0, 0, 0,
  212.   8, -8, 12, -12, 19, -19, 21, -21,
  213.   9, 11, -9, -11, 0, 0, 0, 0,
  214.   1, 10, -1, -10, 0, 0, 0, 0,
  215.   1, 10, -1, -10, 9, 11, -9, -11,
  216.   1, 10, -1, -10, 9, 11, -9, -11,
  217.   -10, -9, -11, 0, 0, 0, 0, 0};
  218. static const INTSIZE __aligned max_steps[8] =
  219. {0, 2, 1, 7, 7, 7, 1, 2};
  220. static const INTSIZE __aligned nunmap[120] =
  221. {
  222.   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  223.   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  224.   -1, 0, 1, 2, 3, 4, 5, 6, 7, -1,
  225.   -1, 8, 9, 10, 11, 12, 13, 14, 15, -1,
  226.   -1, 16, 17, 18, 19, 20, 21, 22, 23, -1,
  227.   -1, 24, 25, 26, 27, 28, 29, 30, 31, -1,
  228.   -1, 32, 33, 34, 35, 36, 37, 38, 39, -1,
  229.   -1, 40, 41, 42, 43, 44, 45, 46, 47, -1,
  230.   -1, 48, 49, 50, 51, 52, 53, 54, 55, -1,
  231.   -1, 56, 57, 58, 59, 60, 61, 62, 63, -1,
  232.   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  233.   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
  234.  
  235. int __aligned InitFlag = false;
  236. void
  237. Initialize_moves (void)
  238.  
  239. /*
  240.  * This procedure pre-calculates all moves for every piece from every square.
  241.  * This data is stored in nextpos/nextdir and used later in the move
  242.  * generation routines.
  243.  */
  244.  
  245. {
  246.   INTSIZE ptyp, po, p0, d, di, s, delta;
  247.   unsigned char *ppos, *pdir;
  248.   INTSIZE dest[8][8];
  249.   INTSIZE steps[8];
  250.   INTSIZE sorted[8];
  251.  
  252.   for (ptyp = 0; ptyp < 8; ptyp++)
  253.     for (po = 0; po < 64; po++)
  254.       for (p0 = 0; p0 < 64; p0++)
  255.     {
  256.       nextpos[ptyp][po][p0] = (unsigned char) po;
  257.       nextdir[ptyp][po][p0] = (unsigned char) po;
  258.     }
  259.   for (ptyp = 1; ptyp < 8; ptyp++)
  260.     for (po = 21; po < 99; po++)
  261.       if (nunmap[po] >= 0)
  262.     {
  263.       ppos = nextpos[ptyp][nunmap[po]];
  264.       pdir = nextdir[ptyp][nunmap[po]];
  265.       /* dest is a function of direction and steps */
  266.       for (d = 0; d < 8; d++)
  267.         {
  268.           dest[d][0] = nunmap[po];
  269.           delta = direc[ptyp][d];
  270.           if (delta != 0)
  271.         {
  272.           p0 = po;
  273.           for (s = 0; s < max_steps[ptyp]; s++)
  274.             {
  275.               p0 = p0 + delta;
  276.  
  277.               /*
  278.                * break if (off board) or (pawns only move two
  279.                * steps from home square)
  280.                */
  281.               if ((nunmap[p0] < 0) || (((ptyp == pawn) || (ptyp == bpawn))
  282.                            && ((s > 0) && ((d > 0) || (Stboard[nunmap[po]] != pawn)))))
  283.             break;
  284.               else
  285.             dest[d][s] = nunmap[p0];
  286.             }
  287.         }
  288.           else
  289.         s = 0;
  290.  
  291.           /*
  292.            * sort dest in number of steps order currently no sort
  293.            * is done due to compability with the move generation
  294.            * order in old gnu chess
  295.            */
  296.           steps[d] = s;
  297.           for (di = d; s > 0 && di > 0; di--)
  298.         if (steps[sorted[di - 1]] == 0)    /* should be: < s */
  299.           sorted[di] = sorted[di - 1];
  300.         else
  301.           break;
  302.           sorted[di] = d;
  303.         }
  304.  
  305.       /*
  306.        * update nextpos/nextdir, pawns have two threads (capture
  307.        * and no capture)
  308.        */
  309.       p0 = nunmap[po];
  310.       if (ptyp == pawn || ptyp == bpawn)
  311.         {
  312.           for (s = 0; s < steps[0]; s++)
  313.         {
  314.           ppos[p0] = (unsigned char) dest[0][s];
  315.           p0 = dest[0][s];
  316.         }
  317.           p0 = nunmap[po];
  318.           for (d = 1; d < 3; d++)
  319.         {
  320.           pdir[p0] = (unsigned char) dest[d][0];
  321.           p0 = dest[d][0];
  322.         }
  323.         }
  324.       else
  325.         {
  326.           pdir[p0] = (unsigned char) dest[sorted[0]][0];
  327.           for (d = 0; d < 8; d++)
  328.         for (s = 0; s < steps[sorted[d]]; s++)
  329.           {
  330.             ppos[p0] = (unsigned char) dest[sorted[d]][s];
  331.             p0 = dest[sorted[d]][s];
  332.             if (d < 7)
  333.               pdir[p0] = (unsigned char) dest[sorted[d + 1]][0];
  334.  
  335.             /*
  336.              * else is already initialized
  337.              */
  338.           }
  339.         }
  340.     }
  341. }
  342.  
  343. void
  344. NewGame (void)
  345.  
  346. /*
  347.  * Reset the board and other variables to start a new game.
  348.  */
  349.  
  350. {
  351.   INTSIZE l;
  352.   int tmp;
  353.   char tstr[32];
  354.   INTSIZE a, r, c, sq, i, found;
  355.   int tmpcolor;
  356.   char s[16];
  357.  
  358.  TTadd = ISZERO = 1;
  359.  cmptr_min = hum_min = cmptr_sec = hum_sec = -1;
  360.  if (AmigaStarted)
  361.   {
  362.    if (FirstTime)
  363.     {
  364.      FirstTime = 0;
  365.     }
  366.    else
  367.     {
  368.      if (!LoadFullBitMap())
  369.       {
  370.        ExitChess();
  371.       }
  372.      (void)SetTaskPri((struct Task *)myproc,procpri);
  373.     }
  374.   }
  375. /* SupervisorMode = 0;*/
  376.  bookflag = previous_score = 0;
  377.  global_tmp_score = 0;
  378.  CheckIllegal = IllegalMove = 0;
  379.   Mate = 0;
  380.  ResignOffered = 0;
  381.  ThinkInARow = ThinkAheadDepth = ThinkAheadWorked = 0;
  382.  DrawnGame = 0;
  383.  MateString[0] = '\0';
  384.   compptr = oppptr = 0; // was -1 in 2.35
  385.   stage = stage2 = -1;        /* the game is not yet started */
  386.   flag.illegal = flag.mate = flag.quit = flag.reverse = flag.bothsides = flag.onemove = flag.force = false;
  387.   flag.material = flag.coords = flag.hash = flag.beep = flag.rcptr = true;
  388.   flag.threat = true;
  389.   flag.stars = flag.shade = flag.back = flag.musttimeout = false;
  390. #ifdef CLIENT
  391.   flag.gamein = true;
  392. #else 
  393.   flag.gamein = false;
  394. #endif
  395. #if defined(MSDOS) && !defined(SEVENBIT)
  396.   flag.rv = false;
  397. #else
  398.   flag.rv = true;
  399. #endif /* MSDOS && !SEVENBIT */
  400.  
  401.   ClearPointer(wG);
  402.   mycnt1 = mycnt2 = 0;
  403.   GenCnt = NodeCnt = et0 = epsquare = XCmore = 0;
  404.   dither = 0;
  405.   WAwindow = WAWNDW;
  406.   WBwindow = WBWNDW;
  407.   BAwindow = BAWNDW;
  408.   BBwindow = BBWNDW;
  409.   xwndw = BXWNDW;
  410.   if (!MaxSearchDepth)
  411.     MaxSearchDepth = MAXDEPTH - 1;
  412.   contempt = 0;
  413.   GameCnt = 0;
  414.   Game50 = 1;
  415.   hint = 0x0C14;
  416.   ISZERO = 1;
  417.   ZeroRPT ();
  418.   Developed[white] = Developed[black] = false;
  419.   MouseDropped = 0;
  420.   Castled[white] = Castled[black] = 0;
  421.   myEnPassant[white] = myEnPassant[black] = 0;
  422.   castld[white] = castld[black] = false;
  423. #if defined NULLMOVE || defined DEEPNULL
  424.   no_null=0;
  425.   null = 0;         /* Null-move already made or not */
  426.   PVari = 0;        /* Is this the PV */
  427. #endif
  428.   PawnStorm = start_stage = 0;
  429.   thrashing_tt = 0; /* must we recycle slots at random. TomV */
  430.   ClearMem(QueenCheck,MAXDEPTH*sizeof(short));
  431.   ClearMem(PrVar,MAXDEPTH*sizeof(short));
  432.   ClearMem(Threat,MAXDEPTH*sizeof(short));
  433.   ClearMem(ThreatSave,MAXDEPTH*sizeof(short));
  434.   ClearMem(Pscore,MAXDEPTH*sizeof(short));
  435.   ClearMem(Tscore,MAXDEPTH*sizeof(short));
  436.   ClearMem(ChkFlag,MAXDEPTH*sizeof(short));
  437.   ClearMem(CptrFlag,MAXDEPTH*sizeof(short));
  438.   ClearMem(PawnThreat,MAXDEPTH*sizeof(short));
  439.   PawnThreat[0] = CptrFlag[0] = false;
  440.   Pscore[0] = 12000;
  441.   Tscore[0] = 12000;
  442.   opponent = white;
  443.   computer = black;
  444.   for (l = 0; l < TREE; l++)
  445.     Tree[l].f = Tree[l].t = 0;
  446. #ifdef OLD_TTABLE
  447.  gsrand ((unsigned int) 1);
  448.   if (!InitFlag)
  449.     {
  450.       for (c = white; c <= black; c++)
  451.     for (p = pawn; p <= king; p++)
  452.       for (l = 0; l < 64; l++)
  453.         {
  454.           hashcode[c][p][l].key = (((unsigned long) urand ()));
  455.           hashcode[c][p][l].key += (((unsigned long) urand ()) << 16);
  456.           hashcode[c][p][l].bd = (((unsigned long) urand ()));
  457.           hashcode[c][p][l].bd += (((unsigned long) urand ()) << 16);
  458. #ifdef LONG64
  459.           hashcode[c][p][l].key += (((unsigned long) urand ()) << 32);
  460.           hashcode[c][p][l].key += (((unsigned long) urand ()) << 48);
  461.           hashcode[c][p][l].bd += (((unsigned long) urand ()) << 32);
  462.           hashcode[c][p][l].bd += (((unsigned long) urand ()) << 48);
  463. #endif
  464.         }
  465.     }
  466. #else //new ttable stuff from pl70
  467.   if (!InitFlag)
  468.     InitHashCode((unsigned int)1);
  469. #endif // oldttable
  470.   for (l = 0; l < 64; l++)
  471.     {
  472.       amigaboard[l] = board[l] = Stboard[l];
  473.       amigacolor[l] = color[l] = Stcolor[l];
  474.       Mvboard[l] = 0;
  475.     }
  476.   InitializeStats ();
  477.   time0 = time ((long *) 0);
  478.   ElapsedTime (1);
  479.   flag.regularstart = true;
  480.   if (MenuStripSet)
  481.    {
  482.     MenuItem8ab.Flags |= CHECKED;
  483.     SetMenuStrip(wG,&MenuList1);    /* attach any Menu */
  484.    }
  485.   Book = BOOKFAIL;
  486.   if (!InitFlag)
  487.     {
  488.       if (TCflag)
  489.        {
  490.         strcpy(tstr,"60 10");
  491.     SelectLevel (tstr);
  492.     SetTimeControl ();
  493.        }
  494.       else if (MaxResponseTime == 0)
  495.        {
  496.         strcpy(tstr,"60 10");
  497.     SelectLevel (tstr);
  498.     SetTimeControl ();
  499.        }
  500.       UpdateDisplay (0, 0, 1, 0);
  501. /*    GetOpenings(black);*/
  502. #ifdef CACHE
  503.       Initialize_ttable();
  504. #endif
  505.       InitFlag = true;
  506.     }
  507.    else
  508.     {
  509.       if (TCflag)
  510.        {
  511.         sprintf(tstr,"%d %d",TCmoves,TCminutes);
  512.     SelectLevel (tstr);
  513.     SetTimeControl ();
  514.        }
  515.     }
  516.   GetOpenings(black);
  517.   hashbd = hashkey = 0;
  518. #ifdef AMIGA
  519.   tmp = player;
  520.   player = white;
  521.   UpdateClocks();
  522.   player = black;
  523.   UpdateClocks();
  524.   player = tmp;
  525. #endif
  526. #ifdef CACHE
  527. #if ttblsz
  528.   ZeroTTable (0);
  529.   TTadd = 0;
  530. #endif /* ttblsz */
  531. #ifndef AMIGA
  532.    memset ((signed char *) etab, 0, sizeof (etab));
  533. #else
  534.    ClearMem(etab,sizeof(etab));
  535. #endif
  536. #endif
  537.  if (PlayMode == 1)
  538.   {
  539.     flag.regularstart = false;
  540.     Book = 0;
  541.  
  542.       strcpy(s," g8");
  543.       a = tmpcolor = black;
  544.       c = s[1] - 'a';
  545.       r = s[2] - '1';
  546.       if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8))
  547.     {
  548.       sq = locn (r, c);
  549.       color[sq] = a;
  550.       board[sq] = no_piece;
  551.       for (i = no_piece; i <= king; i++)
  552.         if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
  553.           {
  554.         board[sq] = i;
  555.         found=1;
  556.         break;
  557.           }
  558.       if ((found==0)||(board[sq] == no_piece)) color[sq] = neutral;    
  559.     }
  560.       strcpy(s," b8");
  561.       a = tmpcolor = black;
  562.       c = s[1] - 'a';
  563.       r = s[2] - '1';
  564.       if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8))
  565.     {
  566.       sq = locn (r, c);
  567.       color[sq] = a;
  568.       board[sq] = no_piece;
  569.       for (i = no_piece; i <= king; i++)
  570.         if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
  571.           {
  572.         board[sq] = i;
  573.         found=1;
  574.         break;
  575.           }
  576.       if ((found==0)||(board[sq] == no_piece)) color[sq] = neutral;    
  577.     }
  578.  
  579.     if (MenuStripSet)
  580.      {
  581.       OnMenu(wG,ADVANCEDMENUNUM);
  582.       OffMenu(wG,BOOKMENUNUM);
  583.       OffMenu(wG,INTERMEDIATEMENUNUM); 
  584.       OnMenu(wG,EASYMENUNUM); 
  585.      }
  586.     GameCnt = 0;
  587.     Game50 = 1;
  588.     ISZERO = 1;
  589.     ZeroRPT ();
  590.     Sdepth2 = Sdepth = 0;
  591.     InitializeStats ();
  592.     DrawAmigaBoard();
  593.   }
  594.  else if (PlayMode == 0)
  595.   {
  596.     flag.regularstart = false;
  597.     Book = 0;
  598.  
  599.       strcpy(s," d8");
  600.       a = tmpcolor = black;
  601.       c = s[1] - 'a';
  602.       r = s[2] - '1';
  603.       if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8))
  604.     {
  605.       sq = locn (r, c);
  606.       color[sq] = a;
  607.       board[sq] = no_piece;
  608.       for (i = no_piece; i <= king; i++)
  609.         if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
  610.           {
  611.         board[sq] = i;
  612.         found=1;
  613.         break;
  614.           }
  615.       if ((found==0)||(board[sq] == no_piece)) color[sq] = neutral;    
  616.     }
  617.       strcpy(s," g8");
  618.       a = tmpcolor = black;
  619.       c = s[1] - 'a';
  620.       r = s[2] - '1';
  621.       if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8))
  622.     {
  623.       sq = locn (r, c);
  624.       color[sq] = a;
  625.       board[sq] = no_piece;
  626.       for (i = no_piece; i <= king; i++)
  627.         if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
  628.           {
  629.         board[sq] = i;
  630.         found=1;
  631.         break;
  632.           }
  633.       if ((found==0)||(board[sq] == no_piece)) color[sq] = neutral;    
  634.     }
  635.       strcpy(s," b8");
  636.       a = tmpcolor = black;
  637.       c = s[1] - 'a';
  638.       r = s[2] - '1';
  639.       if ((c >= 0) && (c < 8) && (r >= 0) && (r < 8))
  640.     {
  641.       sq = locn (r, c);
  642.       color[sq] = a;
  643.       board[sq] = no_piece;
  644.       for (i = no_piece; i <= king; i++)
  645.         if ((s[0] == pxx[i]) || (s[0] == qxx[i]))
  646.           {
  647.         board[sq] = i;
  648.         found=1;
  649.         break;
  650.           }
  651.       if ((found==0)||(board[sq] == no_piece)) color[sq] = neutral;    
  652.     }
  653.  
  654.    if (MenuStripSet)
  655.     {
  656.      OnMenu(wG,ADVANCEDMENUNUM); 
  657.      OnMenu(wG,INTERMEDIATEMENUNUM); 
  658.      OffMenu(wG,EASYMENUNUM);
  659.      OffMenu(wG,BOOKMENUNUM);
  660.     }
  661.     GameCnt = 0;
  662.     Game50 = 1;
  663.     ISZERO = 1;
  664.     ZeroRPT ();
  665.     Sdepth2 = Sdepth = 0;
  666.     InitializeStats ();
  667.     DrawAmigaBoard();
  668.   }
  669.  else if (PlayMode == 2)
  670.   {
  671.     if (MenuStripSet)
  672.      {
  673.       OnMenu(wG,BOOKMENUNUM);
  674.       OffMenu(wG,ADVANCEDMENUNUM); 
  675.       OnMenu(wG,INTERMEDIATEMENUNUM); 
  676.       OnMenu(wG,EASYMENUNUM); 
  677.      }
  678.   }
  679. #ifdef KILLT
  680.  ClearMem(killt,sizeof(killt));
  681.  Initialize_dist ();
  682. #endif
  683. #ifdef HISTORY
  684. #ifdef AMIGA
  685.  ClearMem(history,sizeof(history));
  686. #else
  687.  memset(history,0,sizeof(history));
  688. #endif
  689. #endif
  690. #ifdef NODITHER
  691.   PCRASH = PCRASHS;
  692.   PCENTER = PCENTERS;
  693. #else
  694.   PCRASH = PCRASHS + (dither?(rand() % PCRASHV):0);
  695.   PCENTER = PCENTERS + (dither?(rand() % PCENTERV):0);
  696. #endif
  697.   MoveMem128(board,amigaboard);
  698.   MoveMem128(color,amigacolor);
  699. }
  700.  
  701. void
  702. InitConst (char *lang)
  703. {
  704.   FILE *constfile;
  705.   char s[256];
  706.   char sl[5];
  707.   int len, entry;
  708.   char *p, *q;
  709.  
  710.   constfile = fopen (LANGFILE, "r");
  711.   if (!constfile)
  712.     {
  713.      /* printf ("NO LANGFILE\n");*/
  714.       exit (1);
  715.     }
  716.   while (fgets (s, sizeof (s), constfile))
  717.     {
  718.       if (s[0] == '!')
  719.     continue;
  720.       len = strlen (s);
  721.       for (q = &s[len]; q > &s[8]; q--)
  722.     if (*q == '}')
  723.       break;
  724.       if (q == &s[8])
  725.     {
  726. /*      printf ("{ error in cinstfile\n");*/
  727.       exit (1);
  728.     }
  729.       *q = '\0';
  730.       if (s[3] != ':' || s[7] != ':' || s[8] != '{')
  731.     {
  732.     /*  printf ("Langfile format error %s\n", s);*/
  733.       exit (1);
  734.     }
  735.       s[3] = s[7] = '\0';
  736.       if (lang == NULL)
  737.     {
  738.       lang = sl;
  739.       strcpy (sl, &s[4]);
  740.     }
  741.       if (strcmp (&s[4], lang))
  742.     continue;
  743.       entry = atoi (s);
  744.       if (entry < 0 || entry >= CPSIZE)
  745.     {
  746.      /* printf ("Langfile number error\n");*/
  747.       exit (1);
  748.     }
  749.       for (q = p = &s[9]; *p; p++)
  750.     {
  751.       if (*p != '\\')
  752.         {
  753.           *q++ = *p;
  754.         }
  755.       else if (*(p + 1) == 'n')
  756.         {
  757.           *q++ = '\n';
  758.           p++;
  759.         }
  760.     }
  761.       *q = '\0';
  762.       if (entry < 0 || entry > 255)
  763.     {
  764.      /* printf ("Langfile error %d\n", entry);*/
  765.       exit (0);
  766.     }
  767.       CP[entry] = (char *) malloc ((unsigned) strlen (&s[9]) + 1);
  768.       if (CP[entry] == NULL)
  769.     {
  770.       ShowMessage("malloc");
  771.       exit (0);
  772.     }
  773.       strcpy (CP[entry], &s[9]);
  774.  
  775.     }
  776.   fclose (constfile);
  777. }
  778.  
  779. #ifdef OLDTTABLE
  780.  
  781. #ifndef CACHE
  782. #ifdef ttblsz
  783. void
  784. Initialize_ttable ()
  785. {
  786.   if (rehash < 0)
  787.     rehash = MAXrehash - 1;
  788. }
  789.  
  790. #endif /* ttblsz */
  791.  
  792. #else
  793.  
  794. #ifdef ttblsz
  795. void
  796.  
  797. Initialize_ttable ()
  798. {
  799.   char astr[32];
  800.   int doit = true;
  801.   if (rehash < 0)
  802.     rehash = MAXrehash;
  803. while(doit && ttblsize >= (1<<13)){
  804.   ttable[0] = (struct hashentry *)malloc((unsigned)(sizeof(struct hashentry))*(ttblsize+rehash));
  805.   ttable[1] = (struct hashentry *)malloc((unsigned)(sizeof(struct hashentry))*(ttblsize+rehash));
  806.   if(ttable[0] == NULL || ttable[1] == NULL){
  807.   if(ttable[0] != NULL)free(ttable[0]);
  808.   ttblsize = ttblsize>>1;
  809.   } else doit = false;
  810. }
  811.   if(ttable[0] == NULL || ttable[1] == NULL)
  812.    {
  813.     ShowMessage("Critical Mem Failure");
  814.     Delay(100L);
  815.     AmigaShutDown();
  816.     exit(1);
  817.    }
  818.   sprintf(astr,"transposition tbl is %d\n",ttblsize);
  819.   ShowMessage(astr);
  820. }
  821.  
  822. #endif /* ttblsz */
  823. #endif
  824. #endif // oldttable
  825.